import ast
import logging
from 程序核心代码.mvvm重构.基础定义.基础图形项.节点图形项.带容器带组件带布局的节点图形项 import 带容器带组件带布局的节点图形项
from 程序核心代码.mvvm重构.基础定义.基础模型.容器类节点基础模型 import 容器类Ast模型基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 节点模型匹配器, 注册节点图形项

logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

@注册节点模型(ast.FunctionDef)
class 函数定义节点模型(容器类Ast模型基础模型):
    """
    函数定义节点模型，用于表示Python中的函数定义
    包含函数名、参数列表、函数体和返回值类型注解（如果有）
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, f"函数: {ast节点.name}", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 处理函数参数
        self.处理函数参数()

        # 处理返回值类型注解
        if hasattr(self._ast节点, 'returns') and self._ast节点.returns:
            返回值类型 = 节点模型匹配器(self._ast节点.returns, self.所属节点模型管理器)
            if 返回值类型:
                起始接口 = 返回值类型.添加接口到节点("数据流", "输出", 接口名称="返回值类型", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="返回值类型注解", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 创建函数执行流接口
        self.添加接口到节点("执行流", "输入", 接口名称="函数调用入口")
        self.添加接口到节点("执行流", "输出", 接口名称="函数返回出口")

    def 处理函数参数(self):
        """处理函数的参数列表"""
        参数列表 = self._ast节点.args

        # 处理位置参数
        for 索引, 参数 in enumerate(参数列表.args):
            self.处理单个参数(参数, f"位置参数_{索引}", 参数.arg)

            # 处理参数的默认值
            if 索引 >= len(参数列表.args) - len(参数列表.defaults):
                默认值索引 = 索引 - (len(参数列表.args) - len(参数列表.defaults))
                默认值 = 参数列表.defaults[默认值索引]
                默认值节点 = 节点模型匹配器(默认值, self.所属节点模型管理器)
                if 默认值节点:
                    起始接口 = 默认值节点.添加接口到节点("数据流", "输出", 接口名称=f"默认值_{参数.arg}", 必须连接=True)
                    结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"默认值_{参数.arg}", 必须连接=True)
                    起始接口.接口创建连接线模型(结束接口, self)

        # 处理仅限关键字参数
        for 索引, 参数 in enumerate(参数列表.kwonlyargs):
            self.处理单个参数(参数, f"关键字参数_{索引}", 参数.arg)

            # 处理关键字参数的默认值
            if 索引 < len(参数列表.kw_defaults):
                默认值 = 参数列表.kw_defaults[索引]
                if 默认值:  # 不是None
                    默认值节点 = 节点模型匹配器(默认值, self.所属节点模型管理器)
                    if 默认值节点:
                        起始接口 = 默认值节点.添加接口到节点("数据流", "输出", 接口名称=f"关键字默认值_{参数.arg}", 必须连接=True)
                        结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"关键字默认值_{参数.arg}", 必须连接=True)
                        起始接口.接口创建连接线模型(结束接口, self)

    def 处理单个参数(self, 参数, 参数类型, 参数名):
        """处理单个参数的注解"""
        if hasattr(参数, 'annotation') and 参数.annotation:
            类型注解 = 节点模型匹配器(参数.annotation, self.所属节点模型管理器)
            if 类型注解:
                起始接口 = 类型注解.添加接口到节点("数据流", "输出", 接口名称=f"类型_{参数名}", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"类型_{参数名}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

@注册节点图形项(ast.FunctionDef)
class 函数定义图形节点(带容器带组件带布局的节点图形项):
    """
    函数定义的图形表示，显示函数名、参数列表和函数体
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)